﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using MySql;
using MySql.Data;
using MySql.Data.MySqlClient;
using System.Data.SqlClient;

namespace INSTA_ORM
{
    public class DbAccessor
    {
        private SqlGenerator _sqlGenerator;
        private DataMapper _dataMapper;

        /// <summary>
        /// Permet la connection à la base de donnée.
        /// </summary>
        /// <returns></returns>
        /// 
        public DbAccessor(DataMapper dm)
        {
            _dataMapper = dm;
            _sqlGenerator = new SqlGenerator(dm);
        }

        /// <summary>
        /// Retourne un objet de connexion à la base de données
        /// </summary>
        /// <returns>Un objet MySqlConnection</returns>
        public MySqlConnection getConnection()
        {
            try
            {
                MySqlConnection connection = new MySqlConnection();
                // Identifiant pour se loguer à la base de données
                string ConnnectionStr = "Database = " + ApplicationConstants.ConfigConstants.DB_NAME + "; Data Source = " + ApplicationConstants.ConfigConstants.DB_HOST + "; User Id = " + ApplicationConstants.ConfigConstants.DB_USER + ";";
                connection.ConnectionString = ConnnectionStr;
                // Ici, on ouvre la connexion au serveur
                connection.Open();
                //System.Windows.Forms.MessageBox.Show("Connection reussi");
                return connection;
            }
            catch
            {
                //System.Windows.Forms.MessageBox.Show("Erreur de connection");
            }
            return null;

        }

        /// <summary>
        /// Retourne un dataset comportant la liste des données pour une requête de type select
        /// </summary>
        /// <returns></returns>
        public DataSet getResultForSelect()
        {
            DataSet ds = this.ExecuteQuery(_sqlGenerator.generateSqlForSelect());
            return ds;
        }


        /// <summary>
        /// Retourne un dataset comportant la liste des données pour une requête de type select
        /// </summary>
        /// <returns></returns>
        public int getResultForInsert()
        {
            string strInsertQuery = _sqlGenerator.generateSqlForInsert();
            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = strInsertQuery;
            cmd.Connection = this.getConnection();
            if (cmd.ExecuteNonQuery() > 0)
            {
                this.ExecuteQuery(strInsertQuery);
                return 1;
            }
            return 0;

        }

        /// <summary>
        /// Retourne un dataset comportant la liste des données pour une requête de type delete
        /// </summary>
        /// <returns></returns>
        public int getResultForDelete()
        {
            string strDeleteQuery = _sqlGenerator.generateSqlForDelete();
            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = strDeleteQuery;
            cmd.Connection = this.getConnection();
            if (cmd.ExecuteNonQuery() > 0)
            {
                this.ExecuteQuery(strDeleteQuery);
                return 1;
            }
            return 0;
        }

        /// <summary>
        /// Retourne un dataset comportant la liste des données pour une requête de type update
        /// </summary>
        /// <returns></returns>
        public int getResultForUpdate()
        {
            string strUpdateQuery = _sqlGenerator.generateSqlForUpdate();
            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = strUpdateQuery;
            cmd.Connection = this.getConnection();
            if (cmd.ExecuteNonQuery() > 0)
            {
                this.ExecuteQuery(strUpdateQuery);
                return 1;
            }
            return 0;
        }

        /// <summary>
        /// Execute une requete SQL
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public DataSet ExecuteQuery(string query)
        {
            try
            {
                MySqlDataAdapter myAdapter = new MySqlDataAdapter();
                MySqlConnection connection = this.getConnection();
                // On associe cette requête à la propriété SelectCommand du MySqlDataAdapter
                myAdapter.SelectCommand = new MySqlCommand(query, connection);
                MySqlCommand cmd = new MySqlCommand();

                DataSet ds = new DataSet();
                // On remplit le dataset avec le résultat de la commande SELECT
                myAdapter.Fill(ds, _dataMapper.ClassMapping.TableName);
                // On ferme la connexion le plus tôt possible
                connection.Close();
                return ds;
            }
            catch
            {
                Console.WriteLine("(Exception) - La requete MySQL " + query + " n'a pas pu être executée");
            }
            return null;
        }
    }
}
